package com.springboot.springmvc01helloworld.controller;

import com.springboot.springmvc01helloworld.bean.Person;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

@RestController
public class RequestController {

    /*
    实验一：使用普通变量，收集请求参数
    要求：变量名与参数保持一致
    1.没有携带，包装自动封装为null，基本类型封装为默认值
    2.携带：自动封装
    */

    @RequestMapping("/handle01")
    public String handle01(String username,
                           String password,
                           String cellphone,
                           boolean agreement)
    {
        System.out.println(username);
        System.out.println(password);
        System.out.println(cellphone);
        System.out.println(agreement);
        return "OK";
    }

    /*
    实验二：使用@RequestParam，逐一封装多个参数
    注意：使用@RequestParam取出的参数默认携带,否则报错
        required = false；设置为非必须携带
        defaultValue = "默认值",也可以让参数变为非必须携带

    无论请求参数放到url还是请求体中，都可以使用@RequestParam获取
    */
    @RequestMapping("/handle02")
    public String handle02(@RequestParam("username") String username,
                           @RequestParam("password") String password,
                           @RequestParam("cellphone") String cellphone,
                           @RequestParam(name = "agreement", required = false) boolean agreement)
    {
        System.out.println(username);
        System.out.println(password);
        System.out.println(cellphone);
        System.out.println(agreement);
        return "OK";
    }

    /*
    实验三：使用POJO，匹配封装所有参数
    请求体：username=zhang&password=111111111&cellphone=11111111111&agreement=on
    如果目标方法参数是一个pojo，SpringMVC会自动将 请求参数 和 pojo属性一一匹配，自动封装（需要两者属性值名字一样，不然为效果2）
        效果：
            1.pojo中所有属性值都来自请求参数
            2.如果请求参数没带，封装为null
    */
    @RequestMapping(value = "/handle03", method = RequestMethod.POST)
    public String handle03(Person person)
    {
        System.out.println(person);
        return "OK";
    }

    /*
    实验四：获取请求头

    */
    @RequestMapping("/handle04")
    public String handle04(@RequestHeader("host") String host)
    {
        System.out.println(host);
        return "OK";
    }

    /*
    实验五：获取cookie
    */
    @RequestMapping("/handle05")
    public String handle05(@CookieValue("_ga") String _ga)
    {
        System.out.println(_ga);
        return "OK";
    }

    /*
    实验六：使用POJO，级联封装复杂对象
    */
    @RequestMapping("/handle06")
    public String handle06(Person person)
    {
        System.out.println(person);
        return "OK";
    }

    /**
     * 实验七：
     * @RequestBody: 获取请求体json数据，自动转为person对象
     * 测试接受json数据
     * 1、发出：请求体中是json字符串，不是k=v
     * 2、接受：@RequestBody Person person
     *
     * @RequestBody Person person
     *      1、拿到请求体中的json字符串
     *      2、把json字符串转为person对象
     * @param person
     * @return
     */
    @RequestMapping("/handle07")
    public String handle07(@RequestBody Person person){
        System.out.println(person);
        //自己把字符串转为对象。
        return "ok";
    }

    /**
     * 实验八
     * 文件上传；
     * 1、@RequestParam 取出文件项，封装为MultipartFile，就可以拿到文件内容
     * @param person
     * @return
     */
    @RequestMapping("/handle08")
    public String handle08(Person person,
                           @RequestParam("headerImg") MultipartFile headerImgFile,
                           @RequestPart("lifeImg") MultipartFile[] lifeImgFiles) throws IOException {

        //1、获取原始文件名
        String originalFilename = headerImgFile.getOriginalFilename();
        //2、文件大小
        long size = headerImgFile.getSize();
        //3、获取文件流
        InputStream inputStream = headerImgFile.getInputStream();
        System.out.println(originalFilename + " ==> " + size);
        //4、文件保存
        headerImgFile.transferTo(new File("D:\\img\\" + originalFilename));
        System.out.println("===============以上处理了头像=================");
        if (lifeImgFiles.length > 0) {
            for (MultipartFile imgFile : lifeImgFiles) {
                imgFile.transferTo(new File("D:\\img\\" + imgFile.getOriginalFilename()));
            }
            System.out.println("=======生活照保存结束==========");
        }
        System.out.println(person);
        return "ok!!!";
    }

    /**
     * 实验九：
     * HttpEntity：封装请求头、请求体； 把整个请求拿过来
     *    泛型：<String>：请求体类型； 可以自动转化
     *
     *
     * @return
     */
    @RequestMapping("/handle09")
    public String handle09(HttpEntity<Person> entity){

        //1、拿到所有请求头
        HttpHeaders headers = entity.getHeaders();
        System.out.println("请求头："+headers);
        //2、拿到请求体
        Person body = entity.getBody();
        System.out.println("请求体："+body);
        return "Ok~~~";
    }


    /**
     * 实验十：原生API
     * 接受原生 API
     * @param request
     * @param response
     */
    @RequestMapping("/handle10")
    public void handle10(HttpServletRequest request,
                         HttpServletResponse response,
                         HttpMethod method) throws IOException {
        System.out.println("请求方式："+method);
        String username = request.getParameter("username");
        System.out.println(username);
        response.getWriter().write("ok!!!"+username);
    }
}
